Hands-on Exercise 1

Author

Ha Duc Tien

Published

April 25, 2024

Modified

April 27, 2024

1. Getting Started

1.1 Install and launching R packages

The Code chunk below uses p_load() function of pacman package to check if tidyverse packages are installed in the computer. If they are, then they will be launched into R.

pacman::p_load(readxl, gifski, gapminder,
               plotly, gganimate, tidyverse)

1.2 Importing the data

nfortunately, mutate_each_() was deprecated in dplyr 0.7.0. and funs() was deprecated in dplyr 0.8.0. In view of this, we will re-write the code by using mutate_at() as shown in the code chunk below.

col <- c("Country", "Continent")
globalPop <- read_xls("data/GlobalPopulation.xls", sheet="Data") %>%
              mutate_at(col, as.factor) %>%
              mutate(Year = as.integer(Year))

Instead of using mutate_at(), across() can be used to derive the same outputs.

col <- c("Country", "Continent")
globalPop <- read_xls("data/GlobalPopulation.xls", sheet="Data") %>%
              mutate(across(col, as.factor)) %>%
              mutate(Year = as.integer(Year))

2. Animated Data Visualisation: gganimate methods

gganimate extends the grammar of graphics as implemented by ggplot2 to include the description of animation. It does this by providing a range of new grammar classes that can be added to the plot object in order to customise how it should change with time.

  • transition_*() defines how the data should be spread out and how it relates to itself across time.
  • view_*() defines how the positional scales should change along the animation.
  • shadow_*() defines how data from other points in time should be presented in the given point in time.
  • enter_*()/exit_*() defines how new data should appear and how old data should disappear during the course of the animation.
  • ease_aes() defines how different aesthetics should be eased during transitions.

2.1 Building a static population bubble plot

In the code chunk below, the basic ggplot2 functions are used to create a static bubble plot.

ggplot(globalPop, aes(x = Old, y = Young, size = Population, colour = Country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  labs(title = 'Year: {frame_time}', x = '% Aged', y = '% Young') 

2.2 Building the animated bubble plot

In the code chunk below,

  • transition_time() of gganimate is used to create transition through distinct states in time (i.e. Year).
  • ease_aes() is used to control easing of aesthetics. The default is linear. Other methods are: quadratic, cubic, quartic, quintic, sine, circular, exponential, elastic, back, and bounce.
ggplot(globalPop, aes(x = Old, y = Young, size = Population, colour = Country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  labs(title = 'Year: {frame_time}', x = '% Aged', y = '% Young') +
  transition_time(Year) +       
  ease_aes('linear')          

3. Animated Data Visualisation: plotly

Both ggplotly() and plot_ly() support key frame animations through the frame argument/aesthetic. They also support an ids argument/aesthetic to ensure smooth transitions between objects with the same id (which helps facilitate object constancy).

3.1 Building an animated bubble plot: ggplotly() method

In this sub-section, we will create an animated bubble plot by using ggplotly() method.

gg <- ggplot(globalPop, aes(x = Old, y = Young, 
                            size = Population, colour = Country, frame = Year)) +
      geom_point(aes(size = Population, frame = Year), 
                 alpha = 0.7, show.legend = FALSE) +
      scale_colour_manual(values = country_colors) +
      scale_size(range = c(2, 12)) +
      labs(x = '% Aged', y = '% Young')

ggplotly(gg)

Notice that although show.legend = FALSE argument was used, the legend still appears on the plot. To overcome this problem, theme(legend.position='none') should be used as shown in the plot and code chunk below.

gg <- ggplot(globalPop, aes(x = Old, y = Young, 
                            size = Population, colour = Country, frame = Year)) +
      geom_point(aes(size = Population), 
                 alpha = 0.7, show.legend = FALSE) +
      scale_colour_manual(values = country_colors) +
      scale_size(range = c(2, 12)) +
      labs(x = '% Aged', y = '% Young') +
      theme(legend.position='none')

ggplotly(gg)

3.2 Building an animated bubble plot: plot_ly() method

bp <- globalPop %>%
  plot_ly(x = ~Old, y = ~Young, size = ~Population, color = ~Continent,
          sizes = c(2, 100), frame = ~Year, text = ~Country, 
          hoverinfo = "text", type = 'scatter', mode = 'markers') %>%
  layout(showlegend = FALSE)
bp